// 断言
// 写法1  值 as 类型
// 写法2  <类型> 值

function fn(num:string|number){
    // 把返回值断言成字符串   断言：就是你比你的程序更早知道你传入的是什么类型
    // 不能随便断言 
    // return (<string>num).length
    return (num as string).length
}

console.log(fn('123'));

// 定义一个接口
interface ICat{
    name:string
    sex:string
    run():void //void是一个空值  表示这个函数返回值为空
    eat():void
}
interface IFish{
    name:string
    sex:string
    swim():void
    eat():void

}

// 用联合类型约束我们对象
let animal:ICat|IFish = {
   name:'蓝猫',
   sex:'男',
   run(){
    console.log('猫在地上跑');
    
   },
   swim(){
    console.log('鱼在水里游');
    
   },
   eat(){
    console.log('吃');
    
   }
}
console.log(animal.name);
// animal.eat()
// 当我们访问联合类型上不同的属性或者方法时，我们可以使用断言  
// 如果想要访问run方法 把它断言成 ICat，如果想要访问swim方法，把它断言成IFish
(animal as ICat).run();
(animal as IFish).swim()


// 注意事项
// 类型断言只能够「欺骗」TypeScript 编译器，无法避免运行时的错误，反而滥用类型断言可能会导致运行时错误

// 约束函数
// 如果没有约束函数返回值类型 他默认是any（任意类型）类型
function fun(a:number,b:number):number{
    return a+b
}
console.log(fun(1,2));

var fn1:(x:number,y:number)=>number = function(x:number,y:number):number{
    return x+y
}
console.log(fn1(1,2));

// 接口约束函数

interface Ifun{
    (a:number,b:number,c:number):number
}

let add:Ifun = function(a:number,b:number,c:number):number{
   return a+b+c
}
console.log(add(1,2,3));











